package hehe.log.collect;

import hehe.log.base.Collect;
import hehe.log.base.Logger;
import hehe.log.base.Message;
import hehe.log.base.Target;
import hehe.log.util.LogUtil;
import java.util.Map;
import java.util.Vector;

/**
 * 同步收集
 *<B>说明：</B>
 *<pre>
 * 略
 *</pre>
 *<B>示例：</B>
 *<pre>
 *  略
 *</pre>
 *<B>日志：</B>
 *<pre>
 *  略
 *</pre>
 *<B>注意事项：</B>
 *<pre>
 *  略
 *</pre>
 */
public class SyncCollect extends Collect
{

    /**
     * 日志列表
     *<B>说明：</B>
     *<pre>
     * 线程安全
     *</pre>
     */
    Vector<Message> messages = new Vector<>();

    /**
     * 刷新日志数量
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    protected int flushQuantity = 1;

    public SyncCollect()
    {

    }

    public SyncCollect(Map<String,Object> attrs)
    {
        LogUtil.setAttrs(this,attrs);
    }


    public SyncCollect(Logger logger)
    {
        this.logger = logger;
    }

    public void append(Message message)
    {
        // 日志入队列
        this.messages.add(message);
        if (this.isFlush()) {
            this.flushMessage();
        }
    }

    /**
     * 是否刷新
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public boolean isFlush()
    {
        if (this.flushQuantity > 0 && this.messages.size() >= this.flushQuantity) {
            return true;
        }

        return false;
    }

    /**
     * 日志消息存储
     *<B>说明：</B>
     *<pre>
     * 略
     *</pre>
     */
    public void flushMessage()
    {
        if (this.messages.size() == 0) {
            return;
        }

        // 复制消息
        Vector<Message> messageList = (Vector)this.messages.clone();
        // 清空目前消息
        this.messages.clear();

        // 将日志存储至文件或其他存储设备
        for (Target target:this.logger.getTargets()) {
            target.collect(messageList);
        }
    }
}
